package server

import (
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	"gopkg.in/olahol/melody.v1"
	"time"
)

// HandleClose 当用户断开连接时的判断
func (s *server) HandleClose(session *melody.Session, i int, str string) error {
	u, _ := session.Get("uid")
	uid := u.(string)
	// 获取真实用户
	user, err := s.GetUserByID(uid)
	if err != nil {
		log.Errorf("断开连接时获取用户出错 %s", err)
		return err
	}
	// 根据房间 ID 在房间组中找到房间
	room, err := s.GetRoomByRID(user.RoomID)
	// 如果用户有房间,且不是那种一进大厅就退出的用户
	if err == nil {
		// 房间人数 -1
		room.UserCountCut()
		// 从房间删除该用户
		delete(room.Users, uid)
		// 开始向剩余用户广播消息
		o := &output{
			Code: 102,
			Msg:  "消息推送",
			Data: gin.H{
				"uid":       user.UID,
				"message":   fmt.Sprintf("%s 离开了房间", user.NickName),
				"nick_name": user.NickName,
			},
		}
		out, _ := json.Marshal(o)
		s.BroadcastMultiple(out, room.Users)
	}
	// TODO 当用户退出,房间人数降为 0 时,我们不主动设置 IsFull 属性,我们让其自动被清除房间协程清除即可
	// 删除集合中的该用户
	s.Users.Delete(uid)
	// 总用户数 -1
	s.UserCountCut()
	// 如果一进去就退出是不知道用户性别的
	if user.Sex == 1 {
		s.MaleCountCut()
	} else if user.Sex == 2 {
		s.FemaleCountCut()
	}
	return nil
}

// CancelWaite 当用户取消等待
func (s *server) CancelWaite(session *melody.Session) error {
	id, _ := session.Get("uid")
	user, err := s.GetUserByID(id.(string))
	if err != nil {
		return fmt.Errorf("用户点击取消等待时发生了错误 %s", err)
	}
	// 如果用户还在等待队列中,那我们静待它分配完房间
	for user.RoomID == "" {
		log.Infof("用户 %s 等待离开", id)
		time.Sleep(time.Microsecond)
	}
	log.Infof("用户 %s 成功取消等待", id)
	// 手动将用户移出房间
	// 根据房间 ID 在房间组中找到房间
	room, err := s.GetRoomByRID(user.RoomID)
	if err != nil {
		return fmt.Errorf("用户点击取消等待时发生了错误 %s", err)
	}
	// 房间人数 -1
	room.UserCountCut()
	// 从房间删除该用户
	delete(room.Users, user.UID)
	if user.Sex == 1 {
		s.MaleCountCut()
	} else {
		s.FemaleCountCut()
	}
	return nil
}
